package com.example.liujie.animation

import com.badlogic.gdx.ApplicationAdapter
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.GL20
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.Animation
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.g2d.TextureRegion
import com.badlogic.gdx.utils.Array


/**
 * 游戏主程序的启动入口类
 */
class AnimationGame : ApplicationAdapter() {

    private var batch: SpriteBatch? = null

    private var walkSheetTexture: Texture? = null

    // 行走动画
    private var walkAnimation: Animation? = null

    private var currentFrame: TextureRegion? = null

    // 状态时间, 渲染时间步 delta 的累加值
    private var stateTime: Float = 0.toFloat()


    override fun create() {
        // 创建 Batch
        batch = SpriteBatch()

        // 创建纹理, animation_sheet.png 图片的宽高为 256 * 256, 由 5 行 6列 个不同状态的小人单元格组成
        walkSheetTexture = Texture(Gdx.files.internal("huoying6.png"))

        val frameRows = 11  // 小人单元格的行数
        val frameCols = 5  // 小人单元格的列数

        val perCellWidth = walkSheetTexture!!.getWidth() / frameCols     // 计算每一个小人单元格的宽度
        val perCellHeight = walkSheetTexture!!.getHeight() / frameRows   // 计算每一个小人单元格的高度

        // 按照指定的宽高作为一个单元格分割大图纹理, 分割后的结果为一个 5 * 6 的纹理区域二维数组, 数组中的元素是分割出来的小人单元格
        val cellRegions = TextureRegion.split(walkSheetTexture!!, perCellWidth, perCellHeight)

        // 把二维数组变为一维数组, 因为 Animation 只能接收一维数组作为关键帧序列, 数组中的一个元素（小人单元格的纹理区域）表示一个关键帧

        val walkFrames: Array<TextureRegion> = Array()


        var index = 0
        for (row in 0..frameRows - 1) {
            for (col in 0..frameCols - 1) {
                walkFrames.add(cellRegions[row][col])
            }
        }

        // 使用关键帧（纹理区域）数组 walkFrames 创建一个动画实例, 每一帧（一个小人单元格/纹理区域）播放 0.05 秒
        walkAnimation = Animation(0.1f, walkFrames)

        /*
         * 设置播放模式:
         *
         * Animation.PlayMode.NORMAL: 正常播放一次（默认）
         * Animation.PlayMode.REVERSED: 倒序播放一次
         *
         * Animation.PlayMode.LOOP: 正常循环播放
         * Animation.PlayMode.LOOP_REVERSED: 倒序循环播放
         *
         * Animation.PlayMode.LOOP_RANDOM: 随机循环播放
         * Animation.PlayMode.LOOP_PINGPONG: 开关式（先正序再倒序）循环播放
         */
        walkAnimation!!.setPlayMode(Animation.PlayMode.LOOP)
    }

    override fun render() {
        // 黑色清屏
        Gdx.gl.glClearColor(0f, 0f, 0f, 1f)
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)

        // 累加时间步（stateTime 也可表示游戏的运行时间）
        stateTime += Gdx.graphics.deltaTime

        // 根据当前 播放模式 获取当前关键帧, 就是在 stateTime 这个时刻应该播放哪一帧
        currentFrame = walkAnimation!!.getKeyFrame(stateTime)

        batch!!.begin()

        // 绘制当前关键帧
        batch!!.draw(currentFrame!!, 50f, 100f)

        batch!!.end()
    }

    override fun dispose() {
        // 释放资源
        if (walkSheetTexture != null) {
            walkSheetTexture!!.dispose()
        }
        if (batch != null) {
            batch!!.dispose()
        }
    }

}